<?php
/**
 ***********************************************************************************************************************
 * 适配旧版框架的Active Record
 * @author llq
 ***********************************************************************************************************************
 */
namespace artisan\db;
use artisan\config;

/**
 * Class MySQLiAdapterAR
 * @package artisan\db
 */
class MySQLiAdapterAR extends MySQLiAR
{
    /**
     * 创建或复用一个AR实例
     *
     * @param string $alias
     * @param null|bool $flag 是否使用主库 true强制使用主库 false强制使用从库 null智能选择
     * @return MySQLiAdapterAR
     */
    public static function connect($alias, $useMaster = null)
    {
        $key = md5((string)$alias);
        if(!isset(self::$instances[$key])) {
            self::$instances[$key] = new MySQLiAdapterAR($alias, $useMaster);
        }
        self::$instances[$key]->flag = $useMaster;
        return self::$instances[$key];
    }

    /**
     * 重写适配旧版数据库的query
     *
     * @param $sql
     * @param null $queryType
     * @param null $cacheTime
     * @return array
     */
    public function query($sql, $queryType = null)
    {
        //logDebug($sql,'cm_take_point');
        // 重置影响条数
        $this->affectedRows = 0;
        // 重置错误信息
        $this->currentError = '';
        // 类型检测
        if(empty($sql) || !is_string($sql)) {
            $this->currentError = 'Empty or object sql give';
            return false;
        }
        // 尝试创建连接
        $this->reset();
        $connection = $this->getConnection($this->flag, $sql);
        // 成功创建连接
        if($connection) {
            // 尝试执行SQL
            $resource = $connection->query($sql);
            // 记录执行SQL
            $this->lastQuery = $connection->lastQuery();
            // 记录执行时间
            $this->lastQueryTime = $connection->lastQueryTime();
            // 记录影响行数
            $this->affectedRows = $connection->affectedRows();
            // 记录错误
            $this->currentError = $connection->getError();

            if(empty($queryType)) {
                return $resource;
            } else {
                return $this->_getValue($resource, $queryType);
            }
        } else {
            $this->currentError = 'Get connection failed';
            return false;
        }
    }

    /**
     * 主动关闭连接
     *
     * @return bool
     */
    public function close()
    {
        return MySQLiProxy::close((string)$this->alias);
    }

    /**
     * 兼容旧版
     *
     * @param $result
     * @param $queryType
     * @return array|null
     */
    protected function _getValue($result, $queryType)
    {
        $queryType = strtolower($queryType);
        switch ($queryType) {
            case '1' :
                $row = $this->fetchRow($result);
                $_ret = $row[0];
                break;
            case 'row' :
                $_ret = $this->fetchRow($result);
                break;
            default :
                $_ret = $this->fetchArray($result);
                break;
        }
        return $_ret;
    }

    /**
     * 兼容旧版
     *
     * @param $resource
     * @return array|null
     */
    public function fetchArray($resource)
    {
        if(empty($resource)) {
            return null;
        }
        return mysqli_fetch_assoc($resource);
    }

    /**
     * 兼容旧版
     *
     * @param $resource
     * @return array|null
     */
    public function fetchRow($resource)
    {
        if(empty($resource)) {
            return null;
        }
        return mysqli_fetch_row($resource);
    }

    /**
     * 兼容旧版
     *
     * @param $resource
     * @return array|null
     */
    public function numRows($resource)
    {
        if(empty($resource)) {
            return null;
        }
        return mysqli_num_rows($resource);
    }
}